package com.wyw.confiig;

import com.wyw.entity.UserT;
import com.wyw.shiro.UserRealm;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 需要创建三个bean
 * 1.Subject： 用户主体（把操作交给SecurityManager）
 * 2.SecurityManager：安全管理器（关联Realm）
 * 3.Realm：Shiro连接数据的桥梁
 */
@Configuration
public class ShiroConfig {

    //1.创建ShiroFilterFatoryBean
    @Bean//让spring能拿到下面的方法
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //设置参数
        shiroFilterFactoryBean.setSecurityManager(securityManager);//关联2.安全管理器

        //添加Shiro内置过滤器，实现权限拦截
        //常用：
        //anon：无需认证即可访问
        //authc：必须认证才可以访问
        //user：如果使用了remember me功能，可以直接访问
        //perms：该资源必须得到资源权限才可以访问
        //role：该资源必须得到角色权限才可以访问
        Map<String, String> filterMap = new LinkedHashMap<String, String>();//保证顺序用LinkedHashMap
        //放行某个请求---注意顺序！要在拦截所有资源前面放行
//        filterMap.put("/testThymeleaf", "anon");
//        filterMap.put("/login", "anon");//放行登录请求
//        filterMap.put("/user/login", "anon");//放行登录请求
        filterMap.put("/swagger-ui.html","anon");

        //添加授权过滤器 表示该请求请求的页面需要资源授权才能访问 否则跳转到未授权页面提示（可设置）
        filterMap.put("/add","perms[user:add]");//授权字符串：可以理解成此次授权的id，和授权方法中 info.addStringPermission()的参数保持一致
        filterMap.put("/update","perms[user:update]");

        //过滤的是请求而不是目录
//        filterMap.put("/add","authc");
//        filterMap.put("/update","authc");
        //资源都需要拦截时：
//        filterMap.put("/*", "authc");


        //设置认证失败后要跳转的页面请求
        shiroFilterFactoryBean.setLoginUrl("/toLogin");

        //设置未授权的页面请求
        shiroFilterFactoryBean.setUnauthorizedUrl("/unAuth");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        return shiroFilterFactoryBean;
    }

    /**
     * 2.创建DefaultWebSecurityManager
     *
     * @param userRealm Qualifier表示从bean中获取
     * @return
     */
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //关联3.Realm
        securityManager.setRealm(userRealm);
        return securityManager;
    }


    /**
     * 3.创建Realm:需要自定义，并且继承authorizingRealm类
     *
     * @return
     */
    @Bean(name = "userRealm")//放到容器中
    public UserRealm getRealm() {
        return new UserRealm();
    }
}
